package top.ezzz.config;

import cn.hutool.db.Db;
import cn.hutool.db.DbUtil;
import cn.hutool.db.GlobalDbConfig;
import cn.hutool.log.level.Level;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@Slf4j
public class DbConfig {

    public static DataSource getDataSource() {
        //jdbc:sqlite:./db/system_monitor.db
        //jdbc:sqlite::memory:
        // 1. 配置连接池参数
        HikariConfig config = new HikariConfig();
        // 核心配置：数据库连接URL（SQLite单文件模式）
        config.setJdbcUrl("jdbc:sqlite:E:/db/system_monitor.db");
        // SQLite无需用户名密码，可省略
        config.setUsername("");
        config.setPassword("");
        // 2. 连接池性能配置（根据实际需求调整）
        // 最大连接数：SQLite单文件模式建议5-10，过多会导致锁竞争
        config.setMaximumPoolSize(5);
        // 最小空闲连接数：保持2个空闲连接，避免频繁创建
        config.setMinimumIdle(2);
        // 连接超时时间：3秒内获取不到连接则超时
        config.setConnectionTimeout(3000);
        // 空闲连接超时时间：1分钟未使用则关闭
        config.setIdleTimeout(60000);
        // 连接最大存活时间：0表示无限制（SQLite建议无限制）
        config.setMaxLifetime(0);
        // 3. 连接测试查询（验证连接有效性，SQLite可用简单查询）
        config.setConnectionTestQuery("SELECT 1");
        // 4. 其他优化配置
        // 禁用自动提交（事务场景使用，非事务可开启）
        config.setAutoCommit(true);
        // 连接池名称（日志中显示，便于调试）
        config.setPoolName("Monitor-SQLite-Pool");
        // 5. 初始化数据源
        HikariDataSource dataSource = new HikariDataSource(config);
        // 测试连接是否有效
        try (Connection conn = dataSource.getConnection()) {
            log.info("HikariCP连接池初始化成功！连接池名称：{}，最大连接数：{}",
                    config.getPoolName(), config.getMaximumPoolSize());
        } catch (SQLException e) {
            log.error("HikariCP连接池初始化失败", e);
            // 初始化失败时终止应用（根据实际场景调整）
            throw new RuntimeException("数据库连接池初始化失败", e);
        }
        return dataSource;
    }


    //DbConfig

    public static Db getDb() {
        GlobalDbConfig.setReturnGeneratedKey(true);
        GlobalDbConfig.setShowSql(true, false, true, Level.INFO);
        return DbUtil.use(getDataSource());
    }

}
